/**
 * A、B两类物品，各有若干，每个有代价和收益
 * B数量 <= A数量 <= 5
 * 问不超过MaxV代价的最大收益
 * 首先令 Dijv 是A类物品到第i个位置、数量为j、代价不超过v的最大值
 * 很容易求出来。注意不滚动的话v不要倒序遍历。这里可以滚也可以不滚
 * 然后求出B类物品的
 * 
 * 最后做一个遍历即可。
 * 对A的每一个i, v，检查 D[N][i][v] + E[M][j][MaxV-v] 的最大值，其中 j<=i
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using vi = vector<int>;
using pii = pair<int, int>;
using vpii = vector<pii>;

int N, M, MaxV;
vpii A, B;
vector<vector<vi>> X, Y;

void chkmax(int & d, int a){
    if(-1 == a) return;
    if(-1 ==d or d < a) d = a;
}

void work(){
    cin >> N >> M >> MaxV;
    A.assign(N + 1, {});
    for(int i=1;i<=N;++i) cin >> A[i].first >> A[i].second;
    B.assign(M + 1, {});
    for(int i=1;i<=M;++i) cin >> B[i].first >> B[i].second;

    X.assign(N + 1, vector<vi>(6, vi(MaxV + 1, 0)));
    for(int i=1;i<=N;++i){
        for(int j=1;j<=5;++j){
            for(int v=1;v<=MaxV;++v){ // 不滚动，不要倒
                X[i][j][v] = X[i - 1][j][v]; 
                if(v >= A[i].second) chkmax(X[i][j][v], X[i - 1][j - 1][v - A[i].second] + A[i].first);
            }
        }
    }

    Y.assign(M + 1, vector<vi>(6, vi(MaxV + 1, 0)));
    for(int i=1;i<=M;++i){
        for(int j=1;j<=5;++j){
            for(int v=1;v<=MaxV;++v){
                Y[i][j][v] = Y[i - 1][j][v];
                if(v >= B[i].second) chkmax(Y[i][j][v], Y[i - 1][j - 1][v - B[i].second] + B[i].first);
            }
        }
    }

    const auto & d = X[N];
    const auto & e = Y[M];

    int ans = 0;
    for(int i=0;i<=5;++i){
        for(int v=0;v<=MaxV;++v){
            auto tmp = d[i][v];
            for(int j=0;j<=i;++j){
                auto tt = e[j][MaxV - v];
                chkmax(ans, tmp + tt);
            }
        }
    }
    
    cout << ans << endl;
    return;
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}